// 定义一个结构体 Fibonacci，用于生成斐波那契数列
struct Fibonacci {
    current: u64,
    next: u64,
}

// 实现 Iterator trait，使 Fibonacci 成为迭代器
impl Iterator for Fibonacci {
    type Item = u64; // 指定迭代器生成的元素类型

    // 实现 next 方法，返回迭代器的下一个元素
    fn next(&mut self) -> Option<Self::Item> {
        // 保存当前值，并计算下一个值
        let current = self.current;
        self.current = self.next;
        // 相当于 self.current + (self.next - self.current + self.current) 但更优化
        self.next = self.current + self.next - self.current; 
        
        // 返回当前值，包装在 Option 中
        Some(current)
    }
}
fn coordinate_description(coordinate: (i32, i32)) -> &'static str {
    match coordinate {
        (0, 0) => "Origin",
        (0, _) => "On the x-axis",
        (_, 0) => "On the y-axis",
        (_, _) => "Somewhere else",
    }
}

fn main() {
    // 创建一个 Fibonacci 迭代器实例，初始化为前两个斐波那契数 0 和 1
    let fib_iter = Fibonacci { current: 0, next: 1 };

    // 使用迭代器生成并打印前 10 个斐波那契数
    for (index, value) in fib_iter.enumerate().take(10) {
        println!("Fibonacci number {}: {}", index, value);
    }
    let point = (0, 0);
    println!("{}", coordinate_description(point)); // 输出: Origin

    let point_on_x = (5, 0);
    println!("{}", coordinate_description(point_on_x)); // 输出: On the x-axis

    let point_else = (5, 5);
    println!("{}", coordinate_description(point_else)); // 输出: Somewhere else
}